<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="ue69886ac" id="ue69886ac"><span data-lake-id="u98e5e02f" id="u98e5e02f">Redis有三种主要的集群模式，用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是：主从复制（Master-Slave Replication）、哨兵模式（Sentinel）和Redis Cluster模式。</span></p>
  <p data-lake-id="u72178675" id="u72178675"><span data-lake-id="u09f58b07" id="u09f58b07">​</span><br></p>
  <h3 data-lake-id="h6Hut" id="h6Hut"><span data-lake-id="u7d775bc4" id="u7d775bc4">主从模式</span></h3>
  <p data-lake-id="u9658bac9" id="u9658bac9"><br></p>
  <p data-lake-id="ua67e09b8" id="ua67e09b8"><span data-lake-id="u9cd035b8" id="u9cd035b8">主从复制是Redis最简单的集群模式。这个模式主要是为了解决单点故障的问题，所以将数据复制多个副本中，这样即使有一台服务器出现故障，其他服务器依然可以继续提供服务。</span></p>
  <p data-lake-id="u12a5f150" id="u12a5f150"><span data-lake-id="u740314e9" id="u740314e9">​</span><br></p>
  <p data-lake-id="ua4ac9a3c" id="ua4ac9a3c"><span data-lake-id="ue57d9ffc" id="ue57d9ffc">主从模式中，包括一个主节点（Master）和一个或多个从节点（Slave）。</span><strong><span data-lake-id="u13baf602" id="u13baf602">主节点负责处理所有写操作和读操作，而从节点则复制主节点的数据，并且只能处理读操作。</span></strong><span data-lake-id="ude18f920" id="ude18f920">当主节点发生故障时，可以将一个从节点升级为主节点，实现故障转移（需要手动实现）。</span></p>
  <p data-lake-id="u5087b162" id="u5087b162"><span data-lake-id="uda93442f" id="uda93442f">​</span><br></p>
  <p data-lake-id="ubf889521" id="ubf889521"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690621505299-413de817-a5c0-4f03-8f15-231cbca0735d.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_42%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uf575fe1f" id="uf575fe1f"><span data-lake-id="uaa435c5d" id="uaa435c5d">​</span><br></p>
  <p data-lake-id="u49035eaf" id="u49035eaf"><strong><span data-lake-id="u3114d26e" id="u3114d26e">主从复制的优势在于简单易用，适用于读多写少的场景。</span></strong><span data-lake-id="uceb1c7ba" id="uceb1c7ba">它提供了数据备份功能，并且可以有很好的扩展性，只要增加更多的从节点，就能让整个集群的读的能力不断提升。</span></p>
  <p data-lake-id="u86c811ff" id="u86c811ff"><span data-lake-id="udec30a03" id="udec30a03">​</span><br></p>
  <p data-lake-id="u98bb5e7a" id="u98bb5e7a"><span data-lake-id="u75253490" id="u75253490">但是主从模式最大的缺点，就是不具备故障自动转移的能力，没有办法做容错和恢复。</span></p>
  <p data-lake-id="ub37493c6" id="ub37493c6"><span data-lake-id="udd0e0cf8" id="udd0e0cf8">​</span><br></p>
  <p data-lake-id="u3e17380d" id="u3e17380d"><span data-lake-id="u93c528de" id="u93c528de">主节点和从节点的宕机都会导致客户端部分读写请求失败，需要人工介入让节点恢复或者手动切换一台从节点服务器变成主节点服务器才可以。并且在主节点宕机时，如果数据没有及时复制到从节点，也会导致数据不一致。</span></p>
  <p data-lake-id="uad9631eb" id="uad9631eb"><br></p>
  <p data-lake-id="u6739a5cc" id="u6739a5cc"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690621950721-a01a1b59-078e-4d9b-b3bb-9ec3286394cf.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_41%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u10a6c4b2" id="u10a6c4b2"><span data-lake-id="uc9c79b87" id="uc9c79b87">​</span><br></p>
  <h3 data-lake-id="tbpQL" id="tbpQL"><span data-lake-id="u0a391d24" id="u0a391d24">哨兵模式</span></h3>
  <p data-lake-id="u3b88e5d2" id="u3b88e5d2"><br></p>
  <p data-lake-id="u9a39beb4" id="u9a39beb4"><span data-lake-id="ucb377a5a" id="ucb377a5a">为了解决主从模式的无法自动容错及恢复的问题，Redis引入了一种哨兵模式的集群架构。</span></p>
  <p data-lake-id="u512edd1b" id="u512edd1b"><span data-lake-id="ud3ac52cc" id="ud3ac52cc">​</span><br></p>
  <p data-lake-id="ubf334ad6" id="ubf334ad6"><span data-lake-id="u9aeb38fc" id="u9aeb38fc">哨兵模式是在主从复制的基础上加入了哨兵节点。哨兵节点是一种特殊的Redis节点，用于监控主节点和从节点的状态。当主节点发生故障时，哨兵节点可以自动进行故障转移，选择一个合适的从节点升级为主节点，并通知其他从节点和应用程序进行更新。</span></p>
  <p data-lake-id="u7ec6baef" id="u7ec6baef"><span data-lake-id="ud6c26bd2" id="ud6c26bd2">​</span><br></p>
  <p data-lake-id="uc14fe364" id="uc14fe364"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1690622159156-988b79ae-c4fe-45ec-a32f-620d0a6cb52b.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_43%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u5299c0cc" id="u5299c0cc"><br></p>
  <p data-lake-id="u8901fead" id="u8901fead"><br></p>
  <p data-lake-id="ua5fa0106" id="ua5fa0106"><span data-lake-id="u07ec1935" id="u07ec1935">在原来的主从架构中，引入哨兵节点，其作用是监控Redis主节点和从节点的状态。每个Redis实例都可以作为哨兵节点，通常需要部署多个哨兵节点，以确保故障转移的可靠性。</span></p>
  <p data-lake-id="u575581bb" id="u575581bb"><span data-lake-id="ud6526f2d" id="ud6526f2d">​</span><br></p>
  <p data-lake-id="uf7088d50" id="uf7088d50"><span data-lake-id="u7a5a5f52" id="u7a5a5f52">哨兵节点定期向所有主节点和从节点发送</span><strong><span data-lake-id="u0ac84a4c" id="u0ac84a4c">PING</span></strong><span data-lake-id="ua1675985" id="ua1675985">命令，如果在指定的时间内未收到</span><strong><span data-lake-id="uea41bbfa" id="uea41bbfa">PONG</span></strong><span data-lake-id="u6b158829" id="u6b158829">响应，哨兵节点会将该节点标记为主观下线。如果一个主节点被多数哨兵节点标记为</span><strong><span data-lake-id="u69c6e0b2" id="u69c6e0b2">主观下线</span></strong><span data-lake-id="u1024dc76" id="u1024dc76">，那么它将被标记为</span><strong><span data-lake-id="ucf19e784" id="ucf19e784">客观下线</span></strong><span data-lake-id="ud01fae6b" id="ud01fae6b">。</span></p>
  <p data-lake-id="u426439d7" id="u426439d7"><span data-lake-id="u08d5010e" id="u08d5010e">​</span><br></p>
  <p data-lake-id="u7f6d5985" id="u7f6d5985"><span data-lake-id="ue9bd5264" id="ue9bd5264">当主节点被标记为</span><strong><span data-lake-id="u42569c54" id="u42569c54">客观下线</span></strong><span data-lake-id="uccdf657c" id="uccdf657c">时，哨兵节点会触发故障转移过程。它会从所有健康的从节点中选举一个新的主节点，并将所有从节点切换到新的主节点，实现自动故障转移。同时，哨兵节点会更新所有客户端的配置，指向新的主节点。</span></p>
  <p data-lake-id="ua9230a9c" id="ua9230a9c"><span data-lake-id="u74468c25" id="u74468c25">​</span><br></p>
  <p data-lake-id="ub6535a3e" id="ub6535a3e"><span data-lake-id="uee989464" id="uee989464">哨兵节点通过发布订阅功能来通知客户端有关主节点状态变化的消息。客户端收到消息后，会更新配置，将新的主节点信息应用于连接池，从而使客户端可以继续与新的主节点进行交互。</span></p>
  <p data-lake-id="u9fa21d03" id="u9fa21d03"><br></p>
  <p data-lake-id="u607f0c47" id="u607f0c47"><span data-lake-id="u227fbd3a" id="u227fbd3a">这个集群模式的优点就是为整个集群系统了一种故障转移和恢复的能力。</span></p>
  <p data-lake-id="ufc4bd28b" id="ufc4bd28b"><span data-lake-id="udcba23f4" id="udcba23f4">​</span><br></p>
  <h3 data-lake-id="mhRmZ" id="mhRmZ"><span data-lake-id="u5aec7fc6" id="u5aec7fc6">Cluster模式</span></h3>
  <p data-lake-id="u62cb923e" id="u62cb923e"><br></p>
  <p data-lake-id="u921d8c3e" id="u921d8c3e"><span data-lake-id="ub26aef51" id="ub26aef51">Redis Cluster是Redis中推荐的分布式集群解决方案。它将数据</span><strong><span data-lake-id="u96beb2b6" id="u96beb2b6">自动分片</span></strong><span data-lake-id="uc72917f9" id="uc72917f9">到多个节点上，每个节点负责一部分数据。 </span></p>
  <p data-lake-id="u8a47434b" id="u8a47434b"><span data-lake-id="u7ae0489a" id="u7ae0489a">​</span><br></p>
  <p data-lake-id="u1ad731d0" id="u1ad731d0"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1700226615584-5537b45b-709f-47af-9a9f-83914a885608.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_66%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u5152fa7d" id="u5152fa7d"><br></p>
  <p data-lake-id="u82f551cb" id="u82f551cb"><span data-lake-id="ub52d7a2e" id="ub52d7a2e">Redis Cluster采用主从复制模式来提高可用性。每个分片都有一个主节点和多个从节点。主节点负责处理写操作，而从节点负责复制主节点的数据并处理读请求。</span></p>
  <p data-lake-id="ub9455d61" id="ub9455d61"><span data-lake-id="uf93784f3" id="uf93784f3" class="lake-fontsize-12" style="color: var(--text-primary)">​</span><br></p>
  <p data-lake-id="ue77d35be" id="ue77d35be"><span data-lake-id="ue4ed7f51" id="ue4ed7f51">Redis Cluster能够自动检测节点的故障。当一个节点失去连接或不可达时，Redis Cluster会尝试将该节点标记为不可用，并从可用的从节点中提升一个新的主节点。</span></p>
  <p data-lake-id="u5657dcb0" id="u5657dcb0"><br></p>
  <p data-lake-id="u3fa01987" id="u3fa01987"><span data-lake-id="u13442b04" id="u13442b04">Redis Cluster是适用于大规模应用的解决方案，它提供了更好的横向扩展和容错能力。它自动管理数据分片和故障转移，减少了运维的负担。</span></p>
  <p data-lake-id="ueebf93db" id="ueebf93db"><span data-lake-id="u19eff23d" id="u19eff23d">​</span><br></p>
  <p data-lake-id="u4b4064cb" id="u4b4064cb"><span data-lake-id="u7c2ed316" id="u7c2ed316">Cluster模式的特点是数据分片存储在不同的节点上，每个节点都可以单独对外提供读写服务。不存在单点故障的问题。</span></p>
  <p data-lake-id="u79a02c8c" id="u79a02c8c"><span data-lake-id="u96097243" id="u96097243">​</span><br></p>
  <p data-lake-id="u46966bba" id="u46966bba"><span data-lake-id="u1e5feae5" id="u1e5feae5">关于分片的规则和细节，参考：</span></p>
  <p data-lake-id="u0d982c23" id="u0d982c23"><span data-lake-id="u881a67d0" id="u881a67d0">​</span><br></p>
 </body>
</html>